#ifndef __COMMON_FUNCTION_H__
#define __COMMON_FUNCTION_H__

#include <QDir>
#include <QDomDocument>
#include <QFile>
#include <QString>
#include <QTextStream>

#include <QDebug>

class CCommonFunction {
  public:
    // 数据文件夹
    static bool GetDataSavePath(QString& str)
    {
        QString dirName = "data";
        QDir dir(dirName);
        if (!dir.exists()) {
            // 创建目录
            if (!dir.mkpath("."))
                return false;
        }
        str = "data/";
        return true;
    }

    // 读取 xml 文件，清空不需要的标签信息
    static QDomDocument WriteComponentXmlFile(const QString& strFileName, const QString& modelName, const std::vector<QString>& vecTag)
    {
        QFile file(strFileName);
        QDomDocument doc;

        // xml 根
        QDomElement root;
        if (!file.exists()) {
            // 创建 xml 头部
            QDomProcessingInstruction instruction;
            instruction = doc.createProcessingInstruction("xml", "version = \'1.0\' encoding=\'UTF-8\'");
            doc.appendChild(instruction);

            // 添加根
            root = doc.createElement(modelName);
            doc.appendChild(root);
        }
        else {
            // 打开文件
            if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
                return doc;
            }

            // 读取 xml
            QString error = "";
            int row = 0, column = 0;
            if (!doc.setContent(&file, false, &error, &row, &column)) {
                file.close();
                return doc;
            }
            file.close();

            // 获取根
            root = doc.firstChildElement(modelName);

            // 根不存在则创建
            if (root.isNull()) {
                root = doc.createElement(modelName);
                doc.appendChild(root);
            }
            else {
                for (int i = 0; i < vecTag.size(); ++i) {
                    // 将根中shortcuts节点删除
                    while (true) {
                        QDomElement element = root.firstChildElement(vecTag.at(i));
                        if (!element.isNull()) {
                            root.removeChild(element);
                        }
                        else {
                            break;
                        }
                    }
                }
            }
        }

        return doc;
    }

    void static SaveDomDocument(const QDomDocument& doc, const QString& fileName)
    {
        QFile file(fileName);
        if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
            return;
        }
        QTextStream out(&file);
        doc.save(out, 4);
        file.close();
    }

  private:
    CCommonFunction()
    {
    }
    ~CCommonFunction() {}
};

#endif  // __COMMON_FUNCTION_H__
